import request from '@/utils/request'
import { defineStore } from 'pinia'
import { apiRes, Sku } from '@/types/data'
import { CartItem } from '@/types/car'
import useStore from '..'
// const { user } = useStore()
const useCartStore = defineStore({
  id: 'cart',
  // pinia的持久化存储插件 通过persist可以开启
  persist: {
    key: 'rabbit_cart_92',
  },
  // 状态
  state: () => ({
    // 购物车列表
    list: [] as CartItem[],
  }),
  // 计算
  getters: {
    // 有效商品列表---判断stock
    effectiveList(): CartItem[] {
      return this.list.filter((item) => item.stock > 0 && item.isEffective)
    },
    // 有效商品总数量 ---把effctiveList中的每一项的count叠加起来
    effectiveListCounts(): number {
      return this.effectiveList.reduce((sum, item) => (sum += item.count), 0)
    },
    // 总钱数 ----- 所有单项的钱数累加  单项的钱数 = 数量 * 单价
    effectiveListPrice(): string {
      return this.effectiveList
        .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
        .toFixed(2)
    },

    // 是否全部选中
    isAllSelected(): boolean {
      return this.effectiveList.every((item) => item.selected)
    },

    // 有效商品数量
    selectedList(): CartItem[] {
      return this.effectiveList.filter((item) => item.selected)
    },
    // 已选择有效商品数量
    selectedListCounts(): number {
      return this.selectedList.reduce((sum, item) => (sum += item.count), 0)
    },
    // 已选择商品总价
    selectedListPrice(): string {
      return this.selectedList
        .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
        .toFixed(2)
    },

    // 是否登录
    isLogin(): boolean {
      const { user } = useStore()
      return !!user.profile.token //字符串转布尔值方法 --> !!
    },
  },
  // 方法
  actions: {
    // 添加到购物车
    async addCart(data: CartItem) {
      if (this.isLogin) {
        await request.post('/member/cart', {
          skuId: data.skuId,
          count: data.count,
        })
        this.getCartList()
      } else {
        // console.log('本地添加购物车')
        // 1.先判断购物车中是否已经有该商品
        const goods = this.list.find((item) => item.skuId === data.skuId)
        if (goods) {
          // 2.有就加数量
          goods.count += data.count
        } else {
          // 3.没有就添加到列表中
          this.list.unshift(data)
        }
      }
    },
    // 获取购物车列表
    async getCartList() {
      if (this.isLogin) {
        const res = await request.get<apiRes<CartItem[]>>('/member/cart')
        this.list = res.data.result
      } else {
        // console.log('获取本地购物车')
        // 本地数据会过期，不是最新数据，需要发请求获取最新数据
        this.list.forEach(async (cartItem) => {
          const { skuId } = cartItem
          // 根据 skuId 获取最新商品信息
          const res = await request.get<apiRes<CartItem>>(
            `/goods/stock/${skuId}`
          )
          // 保存最新商品信息
          const lastCartInfo = res.data.result
          // 更新商品现价
          cartItem.nowPrice = lastCartInfo.nowPrice
          // 更新商品库存
          cartItem.stock = lastCartInfo.stock
          // 更新商品是否有效
          cartItem.isEffective = lastCartInfo.isEffective
        })
      }
    },

    // 删除购物车商品
    async deleteCart(skuIds: string[]) {
      if (this.isLogin) {
        await request.delete('/member/cart', {
          data: { ids: skuIds },
        })
        this.getCartList()
      } else {
        this.list = this.list.filter((item) => !skuIds.includes(item.skuId))
      }
    },

    // 修改购物车商品
    async updateCart(
      skuId: string,
      data: { selected?: boolean; count?: number }
    ) {
      if (this.isLogin) {
        await request.put(`/member/cart/${skuId}`, data)
        // 重新获取最新购物车列表
        this.getCartList()
      } else {
        const sku = this.effectiveList.find((item) => item.skuId === skuId)!
        if (data.count !== undefined) sku.count = data.count
        if (data.selected !== undefined) sku.selected = data.selected
      }
    },

    // 修改全选或者全不选
    async updateCartAllSelected(data: { selected: boolean; ids?: string[] }) {
      if (this.isLogin) {
        await request.put('/member/cart/selected', data)
        // 获取购物车列表
        this.getCartList()
      } else {
        this.list.forEach((item) => (item.selected = data.selected))
      }
    },

    // 修改购物车规则
    async updateCartSku(oldSkuId: string, sku: Sku) {
      if (this.isLogin) {
        // 1. 先获取老的商品信息
        const oldGoods = this.list.find((item) => item.skuId === oldSkuId)!
        // 2. 发送请求删除旧的商品
        await request.delete('/member/cart', {
          data: {
            ids: [oldGoods.skuId],
          },
        })
        // 3. 新增商品
        await request.post('/member/cart', {
          skuId: sku.id,
          count: oldGoods.count,
        })
        // 4. 重新渲染
        this.getCartList()
      } else {
        // 思路：
        // 1. 删除原来的商品
        const oldSku = this.effectiveList.find(
          (item) => item.skuId === oldSkuId
        )!
        this.deleteCart([oldSkuId])
        // 2. 添加新的商品
        this.addCart({
          ...oldSku,
          skuId: sku.id,
          nowPrice: sku.price,
          price: sku.price,
          stock: sku.inventory,
          attrsText: sku.specs
            .map((item) => item.name + ':' + item.valueName)
            .join(' '),
        })
      }
    },

    // 清空购物车
    clearCart() {
      // 退出登录需清空购物车
      this.list = []
    },

    // 合并购物车
    async mergeLocalCart() {
      const data = this.list.map(({ skuId, selected, count }) => ({
        skuId,
        selected,
        count,
      }))
      await request.post('/member/cart/merge', data)
      // 合并成功，重新获取购物车列表
      this.getCartList()
    },
  },
})

export default useCartStore
